package com.ikingtech.framework.sdk.department.api;

import com.ikingtech.framework.sdk.base.model.BatchParam;
import com.ikingtech.framework.sdk.base.model.DragOrderParam;
import com.ikingtech.framework.sdk.core.response.R;
import com.ikingtech.framework.sdk.department.model.DeptBasicDTO;
import com.ikingtech.framework.sdk.department.model.DeptDTO;
import com.ikingtech.framework.sdk.department.model.DeptQueryParamDTO;
import com.ikingtech.framework.sdk.web.annotation.PostRequest;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * @author tie yan
 */
public interface DeptApi {

    /**
     * 新增
     *
     * @param dept 部门信息
     * @return 执行结果
     */
    @PostRequest(order = 1, value = "/add", summary = "新增", description = "新增，新增成功后返回编号。")
    R<String> add(@Parameter(name = "dept", description = "部门信息")
                  @RequestBody DeptDTO dept);

    /**
     * 删除
     *
     * @param id 部门编号
     * @return 执行结果
     */
    @PostRequest(order = 2, value = "/delete", summary = "删除", description = "删除。")
    R<Object> delete(@Parameter(name = "id", description = "编号")
                     @RequestBody String id);

    /**
     * 更新
     *
     * @param dept 部门信息
     * @return 执行结果
     */
    @PostRequest(order = 3, value = "/update", summary = "更新", description = "更新。")
    R<Object> update(@Parameter(name = "dept", description = "部门信息")
                     @RequestBody DeptDTO dept);

    /**
     * 分页查询
     *
     * @param queryParam 查询参数
     * @return 执行结果
     */
    @PostRequest(order = 4, value = "/list/page", summary = "分页查询", description = "分页查询，没有查询结果时返回空列表。")
    R<List<DeptDTO>> page(@Parameter(name = "queryParam", description = "查询条件")
                          @RequestBody DeptQueryParamDTO queryParam);

    /**
     * 全量查询
     *
     * @return 执行结果
     */
    @PostRequest(order = 5, value = "/info/list/all", summary = "全量查询", description = "全量查询，没有查询结果时返回空列表。")
    R<List<DeptBasicDTO>> all(@Parameter(name = "excludeId", description = "排除部门编号")
                              @RequestParam(required = false, value = "excludeId") String excludeId);

    /**
     * 查询详情
     *
     * @param id 部门信息
     * @return 执行结果
     */
    @PostRequest(order = 6, value = "/detail/id", summary = "查询详情", description = "查询详情，数据不存在时仍然返回成功,数据为null。")
    R<DeptDTO> detail(@Parameter(name = "id", description = "编号")
                      @RequestBody String id);

    /**
     * 查询基本信息
     *
     * @param id 部门信息
     * @return 执行结果
     */
    @PostRequest(order = 7, value = "/info/id", summary = "查询基本信息", description = "查询详情，数据不存在时仍然返回成功,数据为null。")
    R<DeptBasicDTO> getInfoById(@Parameter(name = "id", description = "编号")
                                @RequestBody String id);

    /**
     * 查询部门列表(多部门编号)
     *
     * @param ids 部门编号集合
     * @return 执行结果
     */
    @PostRequest(order = 8, value = "/info/list/ids", summary = "查询部门列表(多部门编号)", description = "查询部门列表(多部门编号)，没有查询结果时返回空列表。返回内容中的部门主管信息中仅返回部门主管姓名和主管编号，更多主管信息请调用用户模块的接口进行查询。")
    R<List<DeptBasicDTO>> listInfoByIds(@Parameter(name = "ids", description = "待查询部门编号集合。")
                                        @RequestBody BatchParam<String> ids);

    /**
     * 查询所有子部门(父部门编号)
     *
     * @param queryParam 查询参数
     * @return 执行结果
     */
    @PostRequest(order = 12, value = "/sub/all/list", summary = "查询所有子部门(父部门编号)", description = "查询子部门(父部门编号)。")
    R<List<DeptDTO>> listSubAll(@Parameter(name = "queryParam", description = "查询条件")
                                @RequestBody DeptQueryParamDTO queryParam);

    /**
     * 查询所有子部门(父部门编号)
     *
     * @param queryParam 查询参数
     * @return 执行结果
     */
    @PostRequest(order = 12, value = "/info/sub/all/list", summary = "查询所有子部门(父部门编号)", description = "查询子部门(父部门编号)。")
    R<List<DeptBasicDTO>> listSubInfoAll(@Parameter(name = "queryParam", description = "查询条件")
                                         @RequestBody DeptQueryParamDTO queryParam);

    /**
     * 查询所有子部门(多父部门编号)
     *
     * @param parentIds 父部门编号集合
     * @return 执行结果
     */
    @PostRequest(order = 12, value = "/sub/info/list/all/parent-id", summary = "查询所有子部门(多父部门编号)", description = "查询所有子部门(多父部门编号)。")
    R<List<DeptBasicDTO>> listSubInfoAllByParentIds(@Parameter(name = "parentIds", description = "父部门编号，为空时返回所有根部门信息列表，仅支持传递一个父部门编号。")
                                                    @RequestBody BatchParam<String> parentIds);

    /**
     * 查询部门Map(多部门编号)
     *
     * @param ids 部门编号集合
     * @return 执行结果
     */
    @PostRequest(order = 14, value = "/map/info/ids", summary = "查询部门Map(多部门编号)", description = "查询部门Map(多部门编号)，key为部门编号，value为部门信息，没有查询结果时返回空Map。")
    R<Map<String, DeptBasicDTO>> mapInfoByIds(@Parameter(name = "ids", description = "部门编号集合")
                                              @RequestBody BatchParam<String> ids);

    /**
     * 查询部门全路径(多部门编号)
     *
     * @param ids 部门编号集合
     * @return 执行结果
     */
    @PostRequest(order = 16, value = "/full-path/list/ids", summary = "查询部门全路径(多部门编号)", description = "查询部门全路径(多部门编号)，没有查询结果时返回空列表。")
    R<List<String>> listFullPathByIds(@Parameter(name = "ids", description = "部门编号集合。")
                                      @RequestBody BatchParam<String> ids);

    /**
     * 查询部门全路径(全量)
     *
     * @return 执行结果
     */
    @PostRequest(order = 17, value = "/full-path/list/all", summary = "查询部门全路径(全量)", description = "查询部门全路径(全量)，没有查询结果时返回空列表。")
    R<List<String>> fullPathAll();

    /**
     * 拖拽排序
     *
     * @param dragParam 拖拽参数
     * @return 执行结果
     */
    @PostRequest(order = 18, value = "/drag", summary = "拖拽排序", description = "拖拽排序，调用拖拽排序接口后需再次调用列表查询接口展示最新排序结果。")
    R<Object> drag(@Parameter(name = "dragParam", required = true, description = "拖拽参数。")
                   @RequestBody DragOrderParam dragParam);

    /**
     * 查询组织下部门
     *
     * @param orgIds 组织编号集合
     * @return 执行结果
     */
    @PostRequest(order = 20, value = "/full-path/list/org-id", summary = "查询组织下部门", description = "查询组织下部门，没有查询结果时返回空列表。")
    R<List<String>> listFullPathByOrgIds(BatchParam<String> orgIds);
}
